﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Presentation;
using DataAccess;
using Tool;

namespace BusinessLogic
{
	using DictionaryPersonne = Dictionary<string,IPersonneEntity>;

	public class ControllerBusinessPersonne : IControllerBusinessPersonne
	{
		//ATTRIBUTS		
		IControllerData<string, IPersonneEntity> _oControllerData;

		// Dictionnaire d'entité
		Dictionary<string, IPersonneEntity> _oDicoPersonne;
		public Dictionary<string, IPersonneEntity> DicoPersonne
		{
			get 
			{ 
				// Recopie complète du dictionnaire
				if( _oControllerData != null && _oControllerData.DataAltered)
				{
					Dictionary<string, IPersonneEntity> oDicoData = _oControllerData.DicoData;
					if( _oDicoPersonne != null && oDicoData != null)
					{
						_oDicoPersonne = Tool.Container.GetCloneDico<string,IPersonneEntity>(oDicoData);
					}
				}
				
				return _oDicoPersonne;
			}			
		}	

		//Constructeur
		public ControllerBusinessPersonne( IControllerData<string, IPersonneEntity> oControllerData )
		{			
			this._oControllerData = oControllerData;
			_oDicoPersonne = new DictionaryPersonne();
		}

		// METHODES ENTITES METIER

		// Création entité métier
		public IPersonneEntity CreateEntity( IPersonneEntity oPersonneNew )
		{				
			if( oPersonneNew == null )
				return null;

			// Création d'une nouvelle personne avec sa clé propre
			IPersonneEntity oDataNew = FactoryEntity.GetPersonneEntity( oPersonneNew );
			if( oDataNew.IsRecordable() )
			{				
				_oControllerData.InsertData( oDataNew.Code.ToString(), oDataNew );
			}

			return oDataNew;
		}

		// Modification entité métier
		public void UpdateEntity( IPersonneEntity oPersonneToUpdate )
		{	
			if( oPersonneToUpdate.IsRecordable() )
			{	
				_oControllerData.UpdateData( oPersonneToUpdate.Code.ToString(), oPersonneToUpdate );
			}
		}

		// Supression entité métier
		public void DeleteEntity( IPersonneEntity oPersonneToDelete )
		{				
			if( oPersonneToDelete.IsRecordable() )
			{
				_oControllerData.DeleteData( oPersonneToDelete.Code.ToString() );
			}
		}

		// METHODES RESULTAT

		// Calcul de l'age moyen des personnes de l'annuaire
		public double CalculMoyenneAge()
		{
			int nNbInscrit = DicoPersonne.Count();
			if( nNbInscrit == 0 )
				return 0;

			double nAdditionAge = 0;
			foreach( IPersonneEntity oPersonne in DicoPersonne.Values )
			{
				nAdditionAge += oPersonne.Age;
			}

			return nAdditionAge / nNbInscrit;
		}

		// Calcul du nombre de personnes dans l'annuaire.
		public int CalculNombreInscrit()
		{
			return DicoPersonne.Count();
		}
	}
}
